import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @description:
 * @title: CallableDemo
 * @author: zp
 * @date: 2021/8/3 21:01
 * 手动创建线程池
 * 创建线程的四种方式
 * 1.继承线程类
 * 2.实现runnable接口
 * 3.实现callable接口
 * 4.创建线程池
 *
 */
class MyCallable implements Callable<Integer> {
    /**
     * @description:
     * @author: zp
     * @date: 2021/8/3 21:19
     * @param:
     * @return: java.lang.Integer
     * 和runnable接口的不同
     * 1.有返回值
     * 2.有异常抛出
     * 3.实现的方法名称不一样
     */
    @Override
    public Integer call(){
        System.out.println("运行成功");
        return 1024;
    }
}
/**
 * @description:
 * @author: zp
 * @date: 2021/8/5 20:44
 * @param: null
 * @return:
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask=new FutureTask<>(new MyCallable());
        new Thread(futureTask).start();
        //建议把 FutureTask 线程的结果返回放在最后 如果数据没有执行完成 会阻塞等待 直到执行完成
        //方式一
        System.out.println(futureTask.get());
        //方式二
        while (!futureTask.isDone()){
        }
        futureTask.get();
    }
}
